An exploration of dingo observations in the ALA

Time-series analyses can be handy for seeing trends over time, and exploring how trends relate to major events. Here, we show how to create an exploratory time-series plot comparing observations of waterbirds prior to and during the COVID-19 pandemic.

Eukaryota
Animalia
Mammalia
Summaries
Maps
Intern-post
Authors

Amos Smith

Dax Kellie

Published

April 4, 2023

Author

Amos Smith Olivia Torresan
Dax Kellie

Date

4 April 2023

Intern Post

The dingo is among Australia’s most recognised species internationally. However, debate continues about whether dingoes are considered invasive or native species.

Dingoes arrived in Australia around 3,000–5,000 years ago, and their rapid disperal was likely facilitated by humans.

In the present day, dingoes have major negative impacts on livestock producers, especially sheep farmers. To reduce these impacts, landowners and government spend an estimated ~$30 million annually across Australia to control wild dog and dingo populations. Populations are controlled using traps, baits and shooting, along with a barrier to stop their movement into unwanted areas: the Dingo Fence.

The Dingo Fence is a wire fence made to protect from the loss of sheep for the sheep industry; it is the longest fence in the world (5,614 km). Since its construction 80 years ago, the Dingo Fence has shaped the landscape of Australia. However, perhaps unintentionally, the dingo fence has acted as a natural experiment. On the side where dingoes remain present there is more vegetation and fewer invasive species like foxes than on the side where dingoes are absent. The difference between sides of the fence is so distinct that you can even see it from space! Nearly a century later, the dingo fence has shown the importance of apex predators like dingoes in ecosystems and their benefit to native biodiversity.

To understand the debate about dingo’s role in Australia’s ecosystems, it’s useful to know its distribution. Here, we’ll explore how historical and ongoing differences in attitudes towards dingo conservation affect where and how often dingo observations are recorded in the Atlas of Living Australia (ALA).

Summarise observations

Let’s start by finding how many observations of dingoes are in the ALA and where they are.

# packages
library(galah)
library(tidyverse)
library(ozmaps)
library(sf)
library(patchwork)
library(here)
library(rmapshaper)
library(ggpointdensity)
library(glue)
library(ggtext)
library(viridis)

Find fields to filter data

We’ll use the {galah} package to download our data. Because Canis familiaris is the taxonomic name of both dingoes and dogs, if we only search using the scientific name, we’ll likely return more than just dingo records. To fix this, let’s filter our records to those specified by the data provider with the name common name “Dingo”.

One can imagine that sometimes data might be collected without specifying the name “Dingo” (either due to uncertainty or a lack of specificity in the survey).

If true, this means there are observations of dingoes that we’ll never know because they weren’t specified (though it’s hard to know for sure)!

Let’s use search_fields() to help us find which fields we can use to filter the taxonomic name. There are a few options, but the raw_vernacularName field seems to hold original common names specified by data providers.

search_fields("common name")
# A tibble: 4 × 4
  id                   description                                   type  link 
  <chr>                <chr>                                         <chr> <chr>
1 common_name_and_lsid Concatenation of common name and LSID, usefu… fiel… <NA> 
2 vernacularName       The common name the ALA has matched this rec… fiel… <NA> 
3 names_and_lsid       Concatenation of common name and LSID, usefu… fiel… <NA> 
4 raw_vernacularName   The original common name value supplied by t… fiel… <NA> 
search_fields("raw_vernacularName") |> search_values("dingo")
# A tibble: 4 × 2
  field              category           
  <chr>              <chr>              
1 raw_vernacularName Dingo, domestic dog
2 raw_vernacularName Dingo              
3 raw_vernacularName Dingo & Dog (feral)
4 raw_vernacularName dingo              

We can use the same method to find a field that contains states & territories.

search_fields("australian states")
# A tibble: 2 × 4
  id     description                                                 type  link 
  <chr>  <chr>                                                       <chr> <chr>
1 cl2013 ASGS Australian States and Territories Australian Statisti… laye… http…
2 cl22   Australian States and Territories Australian States and Te… laye… http…
search_fields("cl22") |> show_values()
# A tibble: 11 × 2
   field category                    
   <chr> <chr>                       
 1 cl22  New South Wales             
 2 cl22  Victoria                    
 3 cl22  Queensland                  
 4 cl22  South Australia             
 5 cl22  Western Australia           
 6 cl22  Northern Territory          
 7 cl22  Australian Capital Territory
 8 cl22  Tasmania                    
 9 cl22  Unknown1                    
10 cl22  Ashmore and Cartier Islands 
11 cl22  Coral Sea Islands           

State observations

We’ll download the number of dingo observations in each state/territory with atlas_counts() and arrange the resulting counts in descending order.

Around 75% of dingo observations are recorded in the Northern Territory and South Australia.

dingo_counts <- galah_call() |>
  galah_identify("canis familiaris") |>
  galah_filter(raw_vernacularName == c("Dingo", "dingo")) |>
  galah_group_by(cl22) |>
  atlas_counts() |>
  arrange(desc(count))
cl22 count
Northern Territory 6155
South Australia 2933
Queensland 1283
New South Wales 1110
Victoria 412
Western Australia 130
Australian Capital Territory 4

Data providers

Next let’s find out who the main data providers are of dingo observations to see whether observations come from citizen science programs or state monitoring programs. We’ll filter to only display providers that have provided more than 5 observations of dingoes.

data_providers <- galah_call() |>
  galah_identify("canis familiaris") |>
  galah_filter(raw_vernacularName == c("Dingo", "dingo")) |>
  galah_group_by(dataResourceName)|>
  galah_apply_profile(ALA) |>
  atlas_counts()

counts_filtered <- data_providers |>
  filter(count > 5)
# A tibble: 9 × 2
  dataResourceName                                           count
  <chr>                                                      <int>
1 Fauna Atlas N.T.                                            4867
2 SA Fauna (BDBSA)                                            2832
3 Australian National Wildlife Collection provider for OZCAM  2035
4 WildNet - Queensland Wildlife Data                          1120
5 NSW BioNet Atlas                                            1053
6 Victorian Biodiversity Atlas                                 101
7 Australian Museum provider for OZCAM                          76
8 Museums Victoria provider for OZCAM                           36
9 Northern Gulf Fauna Survey                                    18

We can also check to see where each data provider’s observations are recorded. We’ll download dingo observations using atlas_occurrences(). Then we’ll filter our observations to only those supplied by providers in counts_filtered.

You will need to first provide a registered email with the ALA using galah_config() before retrieving records.

dingo_obs <- galah_call()|>
  galah_identify("canis familiaris") |>
  galah_filter(raw_vernacularName == c("Dingo", "dingo")) |>
  galah_apply_profile(ALA) |>
  atlas_occurrences()
points_filtered <- dingo_obs |>
  filter(dataResourceName %in% counts_filtered$dataResourceName)
# A tibble: 12,138 × 8
   decimal…¹ decim…² eventDate           scien…³ taxon…⁴ recor…⁵ dataR…⁶ occur…⁷
       <dbl>   <dbl> <dttm>              <chr>   <chr>   <chr>   <chr>   <chr>  
 1     -39      146. NA                  Canis … https:… 902931… Museum… PRESENT
 2     -39      146. NA                  Canis … https:… e8fc34… Museum… PRESENT
 3     -39      146. NA                  Canis … https:… 091e59… Museum… PRESENT
 4     -38.6    143. 1866-03-27 00:00:00 Canis … https:… 13bd89… Victor… PRESENT
 5     -38.4    146. NA                  Canis … https:… 5b05ba… Museum… PRESENT
 6     -38.4    144. 1865-01-01 00:00:00 Canis … https:… c9f581… Victor… PRESENT
 7     -38.4    143. 1886-09-01 00:00:00 Canis … https:… 4cf713… Victor… PRESENT
 8     -38.4    146. NA                  Canis … https:… 8ef4ea… Museum… PRESENT
 9     -38.1    142. 1886-01-23 00:00:00 Canis … https:… 7deaea… Victor… PRESENT
10     -38.1    146. 1973-04-13 00:00:00 Canis … https:… 00a9e4… Austra… PRESENT
# … with 12,128 more rows, and abbreviated variable names ¹​decimalLatitude,
#   ²​decimalLongitude, ³​scientificName, ⁴​taxonConceptID, ⁵​recordID,
#   ⁶​dataResourceName, ⁷​occurrenceStatus

We’ll create a bar plot and a map of observations to visualise our results.

Just five data providers account for ~98% of dingo records, with Fauna Atlas N. T. contributing ~40% of records. All major data providers are government monitoring programs, rather than citizen science providers like iNaturalist.

Code
custom_colours <- c(
  "Museums Victoria provider for OZCAM" = "#604830",
  "Victorian Biodiversity Atlas" = "#486030",
  "Australian National Wildlife Collection provider for OZCAM" = "#6090d8",
  "NSW BioNet Atlas" = "#604830",
  "WildNet - Queensland Wildlife Data" = "#6fab3f",
  "SA Fauna (BDBSA)" = "#d89060",
  "Australian Museum provider for OZCAM" = "#FFC300",
  "Fauna Atlas N.T." = "#a84830"
)

# Bar plot
counts_filtered |>
  ggplot(aes(
    x = reorder(str_wrap(dataResourceName, 28), count),
    y = count, fill = dataResourceName)) +
  geom_bar(stat = "identity", width = .8) +
  scale_fill_manual(values = custom_colours) +
  scale_x_discrete(expand = c(0, 0)) +
  scale_y_continuous(labels = scales::label_comma()) +
  coord_flip() +
  xlab("") +
  pilot::theme_pilot(grid = "v",
                     axes = "b") +
  theme(legend.position = "none",
        axis.text = element_text(size = 12))
# Map
ggplot() +
  geom_sf(data = aus, fill = "#FBFBEF") +
  geom_point(
    data = points_filtered,
    mapping = aes(
      x = decimalLongitude,
      y = decimalLatitude,
      colour = dataResourceName),
    alpha = 0.5) +
  scale_color_manual(values = custom_colours) +
  theme_void() +
  coord_sf(
    ylim = c(-45, -10),
    xlim = c(110, 155)) +
  theme(legend.position = "none")

Time of year

Next, let’s investigate what months of the year have more dingo records. Viewing observations over time can show us patterns of when a species is most active. It can also reveal human biases in data collection. We’ll look specifically at observations in Northern Territory and South Australia because these states have the most data. Given the huge temperature gradient between the north and south of Australia, we might expect the timing of dingo observations to differ between NT and SA.

First we’ll download observations by month in the Northern Territory by using the month field inside galah_group_by().

Code
## Northern Territory

# download data
dingo_NT <- galah_call() |>
  galah_identify("canis familiaris") |>
  galah_filter(raw_vernacularName == c("Dingo", "dingo"),
               cl22 == "Northern Territory") |>
  galah_group_by(month) |>
  atlas_counts()
# A tibble: 12 × 2
   month count
   <chr> <int>
 1 6       909
 2 7       818
 3 8       771
 4 9       596
 5 5       543
 6 10      526
 7 4       485
 8 3       416
 9 11      368
10 1       276
11 2       220
12 12      205

We’ll use the lubridate::month() function to convert the class of our month column from character to ordered factor.

# format months for plotting
month_NT <- dingo_NT |>
  mutate(
    month = month(as.numeric(month), label = TRUE) # format month
    )
# A tibble: 12 × 2
   month count
   <ord> <int>
 1 Jun     909
 2 Jul     818
 3 Aug     771
 4 Sep     596
 5 May     543
 6 Oct     526
 7 Apr     485
 8 Mar     416
 9 Nov     368
10 Jan     276
11 Feb     220
12 Dec     205

Now we can make a bar chart to see observations over the year. We’ll do the same for South Australia, too.

Northern Territory’s dingo observations are recorded mainly over winter months (June–August). Alternatively, South Australia’s dingo observations are mainly recorded during autumn months (April–June).

# plot
barplot_nt <- ggplot(data = month_NT, 
                     aes(x = month, y = count)) +
  geom_bar(stat = "identity", fill = "#a84830") +
  labs(title = "Northern Territory", 
       x = "Month", 
       y = "No. of observations") +
  scale_x_discrete(expand = c(0,0)) +
  scale_y_continuous(limits = c(0, 1000),
                     expand = c(0,0)) +
  pilot::theme_pilot(grid = "h")
Code
# NT plot
barplot_nt

Code
## South Australia

# download data
dingo_SA <- galah_call() |>
  galah_identify("canis familiaris") |>
  galah_filter(raw_vernacularName == c("Dingo", "dingo"),
               cl22 == "South Australia") |>
  galah_group_by(month) |>
  atlas_counts() |>
  mutate(
    month = month(as.numeric(month), label = TRUE) # format month
    )

# plot
ggplot(data = dingo_SA, 
       aes(x = month, y = count)) +
  geom_bar(stat = "identity", fill = "#d89060") +
  labs(title = "South Australia", 
       x = "Month", 
       y = "No. of observations") +
  scale_x_discrete(expand = c(0,0)) +
  scale_y_continuous(limits = c(0, 1000),
                     expand = c(0,0)) +
  pilot::theme_pilot(grid = "h")

Does this suggest dingoes are more active during winter, or are data collectors surveying during cooler times of the year? The answer might be “both”. One dingo tracking research study found that dingoes are far more active in winter, spending 46% of their day stationary in winter compared to 91% of their day in summer. Similarly, it’s easier for data collectors to survey during winter months when the heat is less extreme. This suggests that cooler winter temperatures allow dingoes and surveyors to be more active, likely increasing the rate of incidental observations.

Dingo observations in nationally protected areas

In the Northern Territory and South Australia, dingoes are protected within nationally protected areas. Does this mean that the majority of observations are recorded within these areas? To answer this question, let’s map locations of dingo observations over protected areas using the Collaborative Australian Protected Areas Database (CAPAD).

Northern Territory

Get shapefiles

We’ll first need the CAPAD shapefile. We can get it by downloading the CAPAD2020_terrestrial.zip folder from their website. Download and save this folder in your R Project or working directory and unzip it.

# read in capad shapefile
capad <- st_read(here("posts",
                      "data",
                      "CAPAD",
                      "CAPAD2020_terrestrial.shp"),
                 quiet = TRUE) |>
  ms_simplify(keep = 0.1) |>
  st_transform(crs = st_crs("WGS84")) |>
  st_make_valid()

Next we will filter our CAPAD layer to only the Northern Territory for our plot.

# filter to NT
capad_nt <- capad |>
  filter(STATE == "NT")

Download records

Now we can download dingo observations in the Northern Territory (and remove any NAs with drop_na()).

# download dingo observations in NT
dingo_obs_NT <- galah_call() |>
  galah_identify("canis familiaris") |>
  galah_filter(raw_vernacularName == c("Dingo", "dingo"),
               cl22 == "Northern Territory") |>
  atlas_occurrences() |>
  drop_na() # filter any NA values out
# A tibble: 6,133 × 8
   decimal…¹ decim…² eventDate           scien…³ taxon…⁴ recor…⁵ dataR…⁶ occur…⁷
       <dbl>   <dbl> <dttm>              <chr>   <chr>   <chr>   <chr>   <chr>  
 1     -26.0    134. 1983-07-13 00:00:00 Canis … https:… 28343a… Fauna … PRESENT
 2     -26.0    129. 1995-09-02 00:00:00 Canis … https:… d08326… SA Fau… PRESENT
 3     -26.0    133. 2001-08-13 00:00:00 Canis … https:… de0ef0… Fauna … PRESENT
 4     -26.0    129. 1995-09-02 00:00:00 Canis … https:… 54ab35… SA Fau… PRESENT
 5     -26.0    133. 2001-08-07 00:00:00 Canis … https:… 3ffd21… Fauna … PRESENT
 6     -26.0    133. 2001-08-13 00:00:00 Canis … https:… 4e02d3… Fauna … PRESENT
 7     -26.0    133. 2001-08-07 00:00:00 Canis … https:… 85d44d… Fauna … PRESENT
 8     -26.0    135. 1997-05-02 00:00:00 Canis … https:… 1736af… Fauna … PRESENT
 9     -26.0    130. 1993-08-07 00:00:00 Canis … https:… 546762… Fauna … PRESENT
10     -26.0    130. 1993-07-30 00:00:00 Canis … https:… 4a111e… Fauna … PRESENT
# … with 6,123 more rows, and abbreviated variable names ¹​decimalLatitude,
#   ²​decimalLongitude, ³​scientificName, ⁴​taxonConceptID, ⁵​recordID,
#   ⁶​dataResourceName, ⁷​occurrenceStatus

Make map

We’ll make our map of the Northern Territory by plotting each of our components and adding a colour scale to indicate places where there is more than one observation in a single point.

# make map
NT_plot <- ggplot() +
  geom_sf(data = ozmap_states |> filter(NAME == "Northern Territory"), 
          fill = "#F8FBEF", 
          colour = "grey60", 
          linewidth = 0.3) +
  geom_pointdensity(data = dingo_obs_NT,
                    mapping = aes(x = decimalLongitude,
                                  y = decimalLatitude),
                    size = 2.4, 
                    alpha = 0.6) +
  geom_sf(data = capad_nt, 
          fill = "#1F901F", 
          colour = "#1F901F", 
          linewidth = 0.5, 
          alpha = 0.2, 
          linetype = "dashed") +
  scale_color_viridis(option = "D", 
                      direction = -1,
                      begin = 0.0,
                      end = 0.4,
                      guide = guide_colorbar(title = ("Number of overlapping observations"),
                                     title.position = "top",
                                     title.hjust = 0.5)) +
  theme_void() +
  theme(legend.position = "bottom",
        legend.title = element_text(face = "bold"),
        legend.key.width = unit(15, 'mm'),
        plot.margin = unit(c(1,0,1,0),"cm"))

Add coloured title

Finally, we can avoid adding more than one legend by using colour in our title to specify that protected areas are coloured green, and dingo observations are coloured dark blue (with a clever method by Cara Thompson). We’ll need to use ggnewscale::new_scale_color() to allow us add our custom text palette in a plot where we already have another palette for our observation points (see our previous post on using {ggnewscale}).

# create palette for title
dingo_palette <- list("protected" = "#1F901F",
                      "obs" = "#404788")

NT_plot +
  ggnewscale::new_scale_color() +
  scale_colour_manual(values = dingo_palette) +
  labs(
    title = glue(
      "<span style='color:{dingo_palette$obs}'>Dingo observations</span> in 
      <span style='color:{dingo_palette$protected}'>**protected areas**</span>"),
    subtitle = "Northern Territory") +
  theme(plot.title = element_markdown(face = "bold", size = 16, hjust = 0.5),
        plot.subtitle = element_markdown(hjust = 0.5, size = 15))

By counting the number of points that intersect with CAPAD areas, we find that more than half of all dingo observations are recorded inside of protected areas.

Tip

To find the number of points that intersect with CAPAD polygons, we used a method described in a previous article. You can check it out here!

# Count number of points that intersect with CAPAD areas
dingo_points_sf <- dingo_obs_NT |> 
  st_as_sf(coords = c("decimalLongitude", "decimalLatitude"), 
  crs = st_crs("WGS84"))

nt_counts <- capad_nt |> 
  mutate(dingo_count = pmap_dbl(.l = list(x = capad_nt$geometry),
                           .f = function(x) {
                             lengths(st_intersects(x, dingo_points_sf))
                             }))

# proportion inside vs outside of protected areas
in_protected <- nt_counts |> pull(dingo_count) |> sum()
out_of_protected <- nrow(dingo_obs_NT)

paste(round(in_protected / out_of_protected * 100, 2), "%", sep = "")
[1] "57.31%"

South Australia

Let’s do the same as above to make a map of South Australia.

We’ll also include a map of where the Dingo Fence is within South Australia to see compare observations on either side (including near it). We obtained a shapefile of the Dingo Fence by emailing the Department of Primary Industries and Regions.

dog_fence <- st_read(here("posts",
                          "data",                    
                          "Dog Fence",
                          "Dog_Fence.shp"),
                     quiet = TRUE) |>
  ms_simplify(keep = 0.1) |>
  st_transform(crs = st_crs("WGS84")) |>
  st_make_valid()

The Dog Fence is labelled in our map below. There are noticeably fewer observations recorded of dingoes on the southern side of the fence, and those that are recorded appear to be mostly inside protected areas.

Code
# filter to SA
capad_sa <- capad |>
  filter(STATE == "SA")

# download dingo observations in SA
dingo_obs_sa <- galah_call() |>
  galah_identify("canis familiaris") |>
  galah_filter(raw_vernacularName == c("Dingo", "dingo"),
               cl22 == "South Australia") |>
  atlas_occurrences() |>
  drop_na() # filter any NA values out

# Start and end points of arrow
arrow <- 
  tibble(
    x1 = c(132.4),
    x2 = c(134),
    y1 = c(-34),
    y2 = c(-32.2))

# make map
sa_plot <- ggplot() +
  geom_sf(data = ozmap_states |> filter(NAME == "South Australia"), 
          fill = "#F8FBEF", 
          colour = "grey60", 
          linewidth = 0.5) +
  geom_pointdensity(data = dingo_obs_sa,
                    mapping = aes(x = decimalLongitude,
                                  y = decimalLatitude),
                    size = 2.4, 
                    alpha = 0.6) +
  geom_sf(data = capad_sa, 
          fill = "#1F901F", 
          colour = "#1F901F", 
          linewidth = 0.5, 
          alpha = 0.2, 
          linetype = "dashed") +
  geom_sf(data = dog_fence, color = "#F0A202", linewidth = 1.8) +
  geom_curve(
    data = arrow, aes(x = x1, y = y1, xend = x2, yend = y2),
    arrow = arrow(length = unit(0.08, "inch")),
    colour = "#392704",
    linewidth = 1.5,
    curvature = 0.3) +
  annotate("text", x = 130.9, y = -34, label = "Dingo Fence", size = 5.5, colour = "#EFA81A") +
  scale_color_viridis(option = "D", 
                      direction = -1,
                      begin = 0.0,
                      end = 0.4,
                      guide = guide_colorbar(title = ("Number of overlapping observations"),
                                     title.position = "top",
                                     title.hjust = 0.5)) +
  theme_void() +
  theme(legend.position = "bottom",
        legend.title = element_text(face = "bold"),
        legend.key.width = unit(15, 'mm'),
        plot.margin = unit(c(1,0,1,0),"cm"))

# add title
sa_plot +
  ggnewscale::new_scale_color() +
  scale_colour_manual(values = dingo_palette) +
  labs(
    title = glue(
      "<span style='color:{dingo_palette$obs}'>Dingo observations</span> in 
      <span style='color:{dingo_palette$protected}'>**protected areas**</span>"),
    subtitle = "South Australia") +
  theme(plot.title = element_markdown(face = "bold", size = 16, hjust = 0.5),
        plot.subtitle = element_markdown(hjust = 0.5, size = 15))

In South Australia around 4 in 10 dingo observations are recorded inside of protected areas.

Code
# Count number of points that intersect with CAPAD areas
dingo_points_sa <- dingo_obs_sa |> 
  st_as_sf(coords = c("decimalLongitude", "decimalLatitude"), 
  crs = st_crs("WGS84"))

sa_counts <- capad_sa |> 
  mutate(dingo_count = pmap_dbl(.l = list(x = capad_sa$geometry),
                           .f = function(x) {
                             lengths(st_intersects(x, dingo_points_sa))
                             }))

# proportion inside vs outside of protected areas
in_protected <- sa_counts |> pull(dingo_count) |> sum()
out_of_protected <- nrow(dingo_obs_sa)

paste(round(in_protected / out_of_protected * 100, 2), "%", sep = "")
[1] "39%"

Final Thoughts

In the Northern Territory and South Australia, we found that a dingo observations made inside and outside of nationally protected areas are fairly similar. We also saw how few observations are on the southern side of the Dingo Fence in South Australia.

But why are 3 of every 4 dingo observations recorded in only two of seven Australian states/territories?

One explanation could be due to differences in legislation between states. The Northern Territory is one of only two states in Australia that recognises dingoes as a protected species (the other is Victoria). In these states, governments may be more interested in monitoring dingoes to maintain their distributions, and therefore have more surveys or programs in place to collect data.

South Australia’s high number of dingo observations, however, is a little more surprising. South Australia is one of several states that have a mixed wild dog control policy, where wild dogs and dingoes are controlled in some areas and protected in others. In South Australia, inside the Dog Fence landholders have a legal responsibility to control wild dogs - including dingoes - on their properties, whereas outside of the Dog Fence dingoes are listed as unprotected native wildlife. There are similar mixed policy strategies in New South Wales and Queensland, while in Western Australia dingoes are required to be controlled because they are classified as a pest species. In these states, control methods may occur at locations without data ever being recorded.

Habitat loss combined with historical and current control programs have reduced total dingo numbers. Dingoes are currently listed as vulnerable to extinction under the IUNC’s Red List of Threatened Species.

Government monitoring programs provide regular and reliable data. However, incidental observations from citizen scientists can fill gaps in species distribution data.

even despite evidence that dingoes can be allies for livestock producers

Dingoes might not always benefit mammal species richness

Expand for session info
─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.2.2 (2022-10-31 ucrt)
 os       Windows 10 x64 (build 19044)
 system   x86_64, mingw32
 ui       RTerm
 language (EN)
 collate  English_Australia.utf8
 ctype    English_Australia.utf8
 tz       Australia/Sydney
 date     2023-04-24
 pandoc   2.19.2 @ C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────
 package        * version date (UTC) lib source
 dplyr          * 1.1.0   2023-01-29 [1] CRAN (R 4.2.2)
 forcats        * 1.0.0   2023-01-29 [1] CRAN (R 4.2.2)
 galah          * 1.5.2   2023-03-20 [1] Github (AtlasOfLivingAustralia/galah@1b35520)
 ggplot2        * 3.4.1   2023-02-10 [1] CRAN (R 4.2.2)
 ggpointdensity * 0.1.0   2019-08-28 [1] CRAN (R 4.2.1)
 ggtext         * 0.1.2   2022-09-16 [1] CRAN (R 4.2.2)
 glue           * 1.6.2   2022-02-24 [1] CRAN (R 4.2.1)
 here           * 1.0.1   2020-12-13 [1] CRAN (R 4.2.1)
 htmltools      * 0.5.4   2022-12-07 [1] CRAN (R 4.2.2)
 lubridate      * 1.9.2   2023-02-10 [1] CRAN (R 4.2.2)
 ozmaps         * 0.4.5   2021-08-03 [1] CRAN (R 4.2.1)
 patchwork      * 1.1.2   2022-08-19 [1] CRAN (R 4.2.1)
 purrr          * 1.0.1   2023-01-10 [1] CRAN (R 4.2.2)
 readr          * 2.1.4   2023-02-10 [1] CRAN (R 4.2.2)
 rmapshaper     * 0.4.6   2022-05-10 [1] CRAN (R 4.2.1)
 sessioninfo    * 1.2.2   2021-12-06 [1] CRAN (R 4.2.1)
 sf             * 1.0-9   2022-11-08 [1] CRAN (R 4.2.2)
 stringr        * 1.5.0   2022-12-02 [1] CRAN (R 4.2.2)
 tibble         * 3.1.8   2022-07-22 [1] CRAN (R 4.2.1)
 tidyr          * 1.3.0   2023-01-24 [1] CRAN (R 4.2.2)
 tidyverse      * 2.0.0   2023-02-22 [1] CRAN (R 4.2.2)
 viridis        * 0.6.2   2021-10-13 [1] CRAN (R 4.2.1)
 viridisLite    * 0.4.1   2022-08-22 [1] CRAN (R 4.2.1)

 [1] C:/Users/KEL329/R-packages
 [2] C:/Users/KEL329/AppData/Local/Programs/R/R-4.2.2/library

──────────────────────────────────────────────────────────────────────────────